package com.heima.behavior.advice;

import com.heima.behavior.dto.BehaviorDto;
import com.heima.common.dto.ResponseResult;
import com.heima.common.enums.AppHttpCodeEnum;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

/**
 * 增强类
 */
@Component  //把切面类交给spring容器
@Aspect  //声明此类是一个切面类
public class BehaviorAdvice {

    @Autowired
    private StringRedisTemplate redisTemplate;

    @Around("execution(* com.heima.behavior.service.impl.*.*(..))")  //环绕通知
    public Object recordToRedis(ProceedingJoinPoint pjp){
        // 记录当前登录人的行为操作

//        举例：当前登录人关注了某个文章作者  redis中的key: "follow_"+当前登录人的id+"_"+设备id+"_"+某个文章作者id+"_"+某个文章id
//        举例：    当前登录人点赞了某个文章  redis中的key: "likes_"+当前登录人的id+"_"+设备id+"_"+某个文章作者id+"_"+某个文章id
        MethodSignature signature = (MethodSignature) pjp.getSignature();
        Method method = signature.getMethod();
        String methodName = method.getName();
        // 判断方法是否以save开头
        if (methodName.startsWith("save")){
        Object[] args = pjp.getArgs();
        BehaviorDto dto = (BehaviorDto) args[0];

        // 操作类型 0  关注 点赞 不喜欢 收藏    1 取消关注 取消点赞 取消不喜欢 取消收藏
        if (dto.getOperation()== 0){
            redisTemplate.boundValueOps(methodName+dto.getUserId()+"_"+dto.getEquipmentId()+"_"+dto.getAuthorId()+"_"+dto.getArticleId()).set("");

            // 向kafka中发送数据  type  0 阅读  1点赞 2评论
//            if (methodName.equals("saveCollectionBehavior")){
//                {"articleId":"123345566","type":3,"add":1}
//            }


        }else {
            // 向kafka中发送数据  type  0 阅读  1点赞 2评论
//            {"articleId":"123345566","type":3,"add":-1}

            redisTemplate.delete(methodName+dto.getUserId()+"_"+dto.getEquipmentId()+"_"+dto.getAuthorId()+"_"+dto.getArticleId());
        }
      }
        try {
            return pjp.proceed();// 执行原方法
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return ResponseResult.errorResult(AppHttpCodeEnum.SERVER_ERROR);
    }
}
